package com.boot.bytebuffer;


import sun.nio.ch.DirectBuffer;

import java.nio.ByteBuffer;

public class ByteBufferTester {

    public static void main(String[] args) {

        int size = 1024 * 1024 * 1024;
        //由于申请内存前可能会调用 System.gc()，所以谨慎设置 -XX:+DisableExplicitGC 这个选项，这个参数作用是禁止代码中显示触发的 Full GC。
        ByteBuffer byteBuffer = ByteBuffer.allocateDirect(size);
        //堆外内存回收
        // 自动回收  Cleaner 继承了PhantomReference 对象回收时通知引用对象  ReferenceHandler 接受通知执行 clean()
        // 手动回收  就是由开发手动调用 DirectByteBuffer 的 cleaner 的 clean 方法来释放空间。
        // 由于 cleaner 是 private 反问权限，所以自然想到使用反射来实现。
        // 还有另一种方法，DirectByteBuffer 实现了 DirectBuffer 接口，这个接口有 cleaner 方法可以获取 cleaner 对象。
        try {
            Thread.sleep(3000l);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }

        //清理内存
        ((DirectBuffer)byteBuffer).cleaner().clean();

        System.gc();
    }

}
